rr library(readxl) library(readr) library(dplyr) library(here) library(tidyverse) library(stringr)

Read in xlsx file

rr sheet1 <- read_xlsx(here(_data/boing-boing-candy-2015.xlsx)) sheet1

Inspect the data i.e. dimensions, variable types, variable names, etc.?

rr dim(sheet1) colnames(sheet1) glimpse(sheet1)

Tidy data - long format

rr sheet1_long <- sheet1 %>% pivot_longer(cols = starts_with([), #converting rows to columns names_to = , values_to = )

#check dimensions, column names dim(sheet1_long) colnames(sheet1_long)

#Omitting columns that are not required

rr sheet1_long <- sheet1_long %>% select(-c(4:29))

colnames(sheet1_long) dim(sheet1_long)

rr colnames(sheet1_long) <- c(, , _out, , ) colnames(sheet1_long)

[1] \timestamp\ \age\       \going_out\ \candy\     \rating\   

#Add column ‘year’

rr sheet1_long <- sheet1_long %>% add_column(year = 2015) head(sheet1_long)

Read in xlsx file

rr sheet2 <- read_xlsx(here(_data/boing-boing-candy-2016.xlsx)) sheet2

Inspect the data i.e. dimensions, variable types, variable names, etc.?

rr dim(sheet2) colnames(sheet2) glimpse(sheet2)

Tidy data - long format

rr sheet2_long <- sheet2 %>% pivot_longer(cols = starts_with([), #converting rows to columns names_to = , values_to = )

dim(sheet2_long) colnames(sheet2_long)

#Omitting columns that are not required

rr sheet2_long <- sheet2_long %>% select(-c(6:22))

colnames(sheet2_long)

[1] \Timestamp\                                                \Are you going actually going trick or treating yourself?\
[3] \Your gender:\                                             \How old are you?\                                        
[5] \Which country do you live in?\                            \candy\                                                   
[7] \rating\                                                  

rr dim(sheet2_long)

[1] 127159      7

rr colnames(sheet2_long) <- c(, _out, , , , , ) colnames(sheet2_long)

[1] \timestamp\ \going_out\ \gender\    \age\       \country\   \candy\     \rating\   

#Add column ‘year’

rr sheet2_long <- sheet2_long %>% add_column(year = 2016) head(sheet2_long) r distinct(sheet2_long, country)

Read in xlsx file

rr sheet3 <- read_xlsx(here(_data/boing-boing-candy-2017.xlsx))

New names:
* `` -> ...114

rr sheet3

Inspect the data i.e. dimensions, variable types, variable names, etc.?

rr dim(sheet3) colnames(sheet3) glimpse(sheet3)

Tidy data - long format

rr sheet3_long <- sheet3 %>% pivot_longer(cols = starts_with(6), #converting rows to columns names_to = , values_to = ) colnames(sheet3_long)

 [1] \Internal ID\                      \Q1: GOING OUT?\                   \Q2: GENDER\                       \Q3: AGE\                         
 [5] \Q4: COUNTRY\                      \Q5: STATE

#Omitting columns that are not required

rr sheet3_long <- sheet3_long %>% select(-c(6:17)) colnames(sheet3_long)

[1] \Internal ID\    \Q1: GOING OUT?\ \Q2: GENDER\     \Q3: AGE\        \Q4: COUNTRY\    \candy\          \rating\        

rr dim(sheet3_long)

[1] 253380      7

#Change col names

rr colnames(sheet3_long) <- c(_id, _out, , , , , ) colnames(sheet3_long)

[1] \internal_id\ \going_out\   \gender\      \age\         \country\     \candy\       \rating\     

rr sheet3_long r #summarise((count = sum(is.na(rating))))

#Add column ‘year’

rr sheet3_long <- sheet3_long %>% add_column(year = 2017) head(sheet3_long) r distinct(sheet3_long, country)

#X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

Combine all sheets

rr

candy_combined <- bind_rows(sheet1_long, sheet2_long, sheet3_long)

colnames(candy_combined)

[1] \timestamp\   \age\         \going_out\   \candy\       \rating\      \year\        \gender\      \country\     \internal_id\

rr dim(candy_combined)

[1] 915389      9

rr head(candy_combined)

#check

rr distinct(candy_combined, going_out)

#Changing column data type

rr candy_combined\(age <- as.integer(candy_combined\)age)

NAs introduced by coercionNAs introduced by coercion to integer range

rr candy_combined\(year <- as.integer(candy_combined\)year) candy_combined\(internal_id <- as.integer(candy_combined\)internal_id) head(candy_combined) r NA

remove age greater than 122

rr candy_combined <- candy_combined %>% filter(age <= 122)

length(candy_combined$age)

[1] 869160

rr distinct(candy_combined, age)

Change string values to lower case

rr candy_combined <- candy_combined %>% mutate_if(is.character, str_to_lower)

head(candy_combined) r unique(candy_combined$country)

  [1] NA                                                                    
  [2] \canada\                                                              
  [3] \usa\                                                                 
  [4] \us\                                                                  
  [5] \uk\                                                                  
  [6] \united states of america\                                            
  [7] \japan\                                                               
  [8] \united states\                                                       
  [9] \france\                                                              
 [10] \ussa\                                                                
 [11] \u.s.a.\                                                              
 [12] \england\                                                             
 [13] \switzerland\                                                         
 [14] \murica\                                                              
 [15] \united kingdom\                                                      
 [16] \neverland\                                                           
 [17] \usa!\                                                                
 [18] \korea\                                                               
 [19] \u.s.\                                                                
 [20] \america\                                                             
 [21] \units states\                                                        
 [22] \belgium\                                                             
 [23] \croatia\                                                             
 [24] \portugal\                                                            
 [25] \usa usa usa\                                                         
 [26] \the best one - usa\                                                  
 [27] \usa! usa! usa!\                                                      
 [28] \españa\                                                              
 [29] \there isn't one for old men\                                         
 [30] \panama\                                                              
 [31] \the yoo ess of aaayyyyyy\                                            
 [32] \united kindom\                                                       
 [33] \hungary\                                                             
 [34] \austria\                                                             
 [35] \new zealand\                                                         
 [36] \germany\                                                             
 [37] \mexico\                                                              
 [38] \australia\                                                           
 [39] \brasil\                                                              
 [40] \god's country\                                                       
 [41] \south korea\                                                         
 [42] \usa!!!!!!\                                                           
 [43] \philippines\                                                         
 [44] \eua\                                                                 
 [45] \usa! usa!\                                                           
 [46] \sweden\                                                              
 [47] \united sates\                                                        
 [48] \the netherlands\                                                     
 [49] \finland\                                                             
 [50] \merica\                                                              
 [51] \china\                                                               
 [52] \kenya\                                                               
 [53] \the republic of cascadia\                                            
 [54] \united stetes\                                                       
 [55] \usa usa usa usa\                                                     
 [56] \united  states of america\                                           
 [57] \netherlands\                                                         
 [58] \united state\                                                        
 [59] \united staes\                                                        
 [60] \uae\                                                                 
 [61] \usausausa\                                                           
 [62] \unhinged states\                                                     
 [63] \us of a\                                                             
 [64] \unites states\                                                       
 [65] \the united states\                                                   
 [66] \north carolina\                                                      
 [67] \unied states\                                                        
 [68] \europe\                                                              
 [69] \earth\                                                               
 [70] \u s\                                                                 
 [71] \u.k.\                                                                
 [72] \costa rica\                                                          
 [73] \the united states of america\                                        
 [74] \unite states\                                                        
 [75] \cascadia\                                                            
 [76] \greece\                                                              
 [77] \usa? hard to tell anymore..\                                         
 [78] \'merica\                                                             
 [79] \usas\                                                                
 [80] \pittsburgh\                                                          
 [81] \a\                                                                   
 [82] \can\                                                                 
 [83] \canae\                                                               
 [84] \new york\                                                            
 [85] \trumpistan\                                                          
 [86] \ireland\                                                             
 [87] \california\                                                          
 [88] \south africa\                                                        
 [89] \i pretend to be from canada

rr country_distinct <- distinct(candy_combined, country)

Cleaning candy column

rr candy_combined <- candy_combined %>% mutate(candy = str_extract(candy, \[^\\[\\]]+), candy = str_extract(candy, [^q6 |]+[^|]+))

#cleaning country column

rr canada_error <- c(, `) uk_error <- c(, , , k., kindom, kingdom) usa_error <- c('merica, , , , , . america, jersey, york, carolina, , united states, united states of america, yoo ess of aaayyyyyy, , , a, s., s.a.,
states, states, states, states of america, sates, staes, state, statea, stated, states, states of america, statss, stetes, ststes, states, states, , of a, usa usa, usa usa usa, usa usa!!!!, !, ! usa!, ! usa! usa!, !!!!!!, ? hard to tell anymore.., , , ,
) candy_combined <- candy_combined %>% mutate(country = ifelse(country %in% canada_error, , country), country = ifelse(country %in% uk_error, , country), country = ifelse(country %in% usa_error, , country))

country_distinct <- distinct(candy_combined, country)

candy_combined %>%
  filter(candy != "cash, or other forms of legal tender")

#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1.4.2 Analysis questions 1. What is the total number of candy ratings given across the three years. (number of candy ratings, not number of raters. Don’t count missing values)

rr candy_combined %>% filter(!is.na(rating)) %>% summarise(total_rating_count = n()) r

#total_candy_ratings

  1. What was the average age of people who are going out trick or treating and the average age of people not going trick or treating?

rr candy_combined %>% select(going_out, age) %>% filter(!is.na(going_out)) %>% group_by(going_out) %>% summarise(average_age = mean(age))

`summarise()` ungrouping output (override with `.groups` argument)
  1. For each of joy, despair and meh, which candy bar revived the most of these ratings?

rr candy_combined %>% select(candy, rating) %>% filter(!is.na(rating)) %>% group_by(rating, candy) %>% summarise(count = n()) %>% arrange(desc(count)) %>% slice(seq_len(1))

`summarise()` regrouping output by 'rating' (override with `.groups` argument)

rr distinct(candy_combined, candy)

  1. How many people rated Starburst as despair?

rr candy_combined %>% select(candy, rating) %>% filter(candy == , rating == ) %>% group_by(rating) %>% summarise(starburst_count = n()) #%>%

`summarise()` ungrouping output (override with `.groups` argument)

rr #arrange(desc(count)) #%>% #slice(seq_len(3))

For the next three questions, count despair as -1, joy as +1 and meh as 0.

  1. What was the most popular candy bar by this rating system for each gender in the dataset?

rr candy_combined %>% select(gender, candy, rating) %>% filter(!is.na(rating)) %>% mutate(new_rating = case_when(rating ==  ~ -1, rating ==  ~ 1, rating ==  ~ 0,)) %>% group_by(gender, candy) %>% summarise(count_popular = sum(new_rating)) %>% arrange(desc(count_popular)) %>% slice(seq_len(1))

`summarise()` regrouping output by 'gender' (override with `.groups` argument)
  1. What was the most popular candy bar in each year?

rr candy_combined %>% select(year, candy, rating) %>% filter(!is.na(rating)) %>% mutate(new_rating = case_when(rating ==  ~ -1, rating ==  ~ 1, rating ==  ~ 0,)) %>% group_by(year, candy) %>% summarise(popular_candy = sum(new_rating)) %>% arrange(desc(popular_candy)) %>% slice(seq_len(1))

`summarise()` regrouping output by 'year' (override with `.groups` argument)
  1. What was the most popular candy bar by this rating for people in US, Canada, UK and all other countries?

TEST XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

rr sheet3_long %>% mutate(new_candy3= str_extract(candy, [^Q6 |]+[^|]+)) r new_candy3

Error: object 'new_candy3' not found

rr sheet2_long %>% mutate(new_candy2 = str_extract(candy, \[^\\[\\]]+)) r new_candy2

Error: object 'new_candy2' not found
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHN0cmluZ3IpCmBgYAoKIyBSZWFkIGluIHhsc3ggZmlsZQoKYGBge3J9CnNoZWV0MSA8LSByZWFkX3hsc3goaGVyZSgicmF3X2RhdGEvYm9pbmctYm9pbmctY2FuZHktMjAxNS54bHN4IikpCnNoZWV0MQpgYGAKCiMgSW5zcGVjdCB0aGUgZGF0YSBpLmUuIGRpbWVuc2lvbnMsIHZhcmlhYmxlIHR5cGVzLCB2YXJpYWJsZSBuYW1lcywgZXRjLj8KCmBgYHtyfQpkaW0oc2hlZXQxKQpjb2xuYW1lcyhzaGVldDEpCmdsaW1wc2Uoc2hlZXQxKQpgYGAKCiMgVGlkeSBkYXRhIC0gbG9uZyBmb3JtYXQKCmBgYHtyfQpzaGVldDFfbG9uZyA8LSBzaGVldDEgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiWyIpLCAgI2NvbnZlcnRpbmcgcm93cyB0byBjb2x1bW5zIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJjYW5keSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyYXRpbmciKQoKI2NoZWNrIGRpbWVuc2lvbnMsIGNvbHVtbiBuYW1lcwpkaW0oc2hlZXQxX2xvbmcpCmNvbG5hbWVzKHNoZWV0MV9sb25nKQpgYGAKCiNPbWl0dGluZyBjb2x1bW5zIHRoYXQgYXJlIG5vdCByZXF1aXJlZAoKYGBge3J9CnNoZWV0MV9sb25nIDwtIHNoZWV0MV9sb25nICU+JQogIHNlbGVjdCgtYyg0OjI5KSkKCmNvbG5hbWVzKHNoZWV0MV9sb25nKQpkaW0oc2hlZXQxX2xvbmcpCmBgYAoKCmBgYHtyfQpjb2xuYW1lcyhzaGVldDFfbG9uZykgPC0gYygidGltZXN0YW1wIiwgImFnZSIsICJnb2luZ19vdXQiLCAiY2FuZHkiLCAicmF0aW5nIikKY29sbmFtZXMoc2hlZXQxX2xvbmcpCgpgYGAKCiNBZGQgY29sdW1uICd5ZWFyJwoKYGBge3J9CnNoZWV0MV9sb25nIDwtIHNoZWV0MV9sb25nICU+JQogIGFkZF9jb2x1bW4oeWVhciA9IDIwMTUpCmhlYWQoc2hlZXQxX2xvbmcpCmBgYAoKCiMgUmVhZCBpbiB4bHN4IGZpbGUKCmBgYHtyfQpzaGVldDIgPC0gcmVhZF94bHN4KGhlcmUoInJhd19kYXRhL2JvaW5nLWJvaW5nLWNhbmR5LTIwMTYueGxzeCIpKQpzaGVldDIKYGBgCgojIEluc3BlY3QgdGhlIGRhdGEgaS5lLiBkaW1lbnNpb25zLCB2YXJpYWJsZSB0eXBlcywgdmFyaWFibGUgbmFtZXMsIGV0Yy4/CgpgYGB7cn0KZGltKHNoZWV0MikKY29sbmFtZXMoc2hlZXQyKQpnbGltcHNlKHNoZWV0MikKYGBgCgojIFRpZHkgZGF0YSAtIGxvbmcgZm9ybWF0CgpgYGB7cn0Kc2hlZXQyX2xvbmcgPC0gc2hlZXQyICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gc3RhcnRzX3dpdGgoIlsiKSwgICNjb252ZXJ0aW5nIHJvd3MgdG8gY29sdW1ucyAKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiY2FuZHkiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicmF0aW5nIikKCmRpbShzaGVldDJfbG9uZykKY29sbmFtZXMoc2hlZXQyX2xvbmcpCmBgYAoKI09taXR0aW5nIGNvbHVtbnMgdGhhdCBhcmUgbm90IHJlcXVpcmVkCgpgYGB7cn0Kc2hlZXQyX2xvbmcgPC0gc2hlZXQyX2xvbmcgJT4lCiAgc2VsZWN0KC1jKDY6MjIpKQoKY29sbmFtZXMoc2hlZXQyX2xvbmcpCmRpbShzaGVldDJfbG9uZykKYGBgCgoKYGBge3J9CmNvbG5hbWVzKHNoZWV0Ml9sb25nKSA8LSBjKCJ0aW1lc3RhbXAiLCAiZ29pbmdfb3V0IiwgImdlbmRlciIsICJhZ2UiLCAiY291bnRyeSIsICJjYW5keSIsICJyYXRpbmciKQpjb2xuYW1lcyhzaGVldDJfbG9uZykKYGBgCgojQWRkIGNvbHVtbiAneWVhcicKCmBgYHtyfQpzaGVldDJfbG9uZyA8LSBzaGVldDJfbG9uZyAlPiUKICBhZGRfY29sdW1uKHllYXIgPSAyMDE2KQpoZWFkKHNoZWV0Ml9sb25nKQpkaXN0aW5jdChzaGVldDJfbG9uZywgY291bnRyeSkKYGBgCgoKCiMgUmVhZCBpbiB4bHN4IGZpbGUKCgpgYGB7cn0Kc2hlZXQzIDwtIHJlYWRfeGxzeChoZXJlKCJyYXdfZGF0YS9ib2luZy1ib2luZy1jYW5keS0yMDE3Lnhsc3giKSkKc2hlZXQzCmBgYAoKIyBJbnNwZWN0IHRoZSBkYXRhIGkuZS4gZGltZW5zaW9ucywgdmFyaWFibGUgdHlwZXMsIHZhcmlhYmxlIG5hbWVzLCBldGMuPwoKYGBge3J9CmRpbShzaGVldDMpCmNvbG5hbWVzKHNoZWV0MykKZ2xpbXBzZShzaGVldDMpCmBgYAoKIyBUaWR5IGRhdGEgLSBsb25nIGZvcm1hdAoKYGBge3J9CnNoZWV0M19sb25nIDwtIHNoZWV0MyAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IHN0YXJ0c193aXRoKCJRNiIpLCAgI2NvbnZlcnRpbmcgcm93cyB0byBjb2x1bW5zIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJjYW5keSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyYXRpbmciKQpjb2xuYW1lcyhzaGVldDNfbG9uZykKYGBgCgojT21pdHRpbmcgY29sdW1ucyB0aGF0IGFyZSBub3QgcmVxdWlyZWQKCmBgYHtyfQpzaGVldDNfbG9uZyA8LSBzaGVldDNfbG9uZyAlPiUKICBzZWxlY3QoLWMoNjoxNykpCmNvbG5hbWVzKHNoZWV0M19sb25nKQpkaW0oc2hlZXQzX2xvbmcpCmBgYAoKCiNDaGFuZ2UgY29sIG5hbWVzCgpgYGB7cn0KY29sbmFtZXMoc2hlZXQzX2xvbmcpIDwtIGMoImludGVybmFsX2lkIiwgImdvaW5nX291dCIsICJnZW5kZXIiLCAiYWdlIiwgImNvdW50cnkiLCAiY2FuZHkiLCAicmF0aW5nIikKY29sbmFtZXMoc2hlZXQzX2xvbmcpCgpzaGVldDNfbG9uZwojc3VtbWFyaXNlKChjb3VudCA9IHN1bShpcy5uYShyYXRpbmcpKSkpCmBgYAoKCiNBZGQgY29sdW1uICd5ZWFyJwoKYGBge3J9CnNoZWV0M19sb25nIDwtIHNoZWV0M19sb25nICU+JQogIGFkZF9jb2x1bW4oeWVhciA9IDIwMTcpCmhlYWQoc2hlZXQzX2xvbmcpCmRpc3RpbmN0KHNoZWV0M19sb25nLCBjb3VudHJ5KQpgYGAKCiNYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCAKCiMgQ29tYmluZSBhbGwgc2hlZXRzIAoKYGBge3J9CgpjYW5keV9jb21iaW5lZCA8LSBiaW5kX3Jvd3Moc2hlZXQxX2xvbmcsIHNoZWV0Ml9sb25nLCBzaGVldDNfbG9uZykKCmNvbG5hbWVzKGNhbmR5X2NvbWJpbmVkKQpkaW0oY2FuZHlfY29tYmluZWQpCmhlYWQoY2FuZHlfY29tYmluZWQpCmBgYAoKI2NoZWNrCgpgYGB7cn0KZGlzdGluY3QoY2FuZHlfY29tYmluZWQsIGdvaW5nX291dCkKYGBgCgoKI0NoYW5naW5nIGNvbHVtbiBkYXRhIHR5cGUKCmBgYHtyfQpjYW5keV9jb21iaW5lZCRhZ2UgPC0gYXMuaW50ZWdlcihjYW5keV9jb21iaW5lZCRhZ2UpCmNhbmR5X2NvbWJpbmVkJHllYXIgPC0gYXMuaW50ZWdlcihjYW5keV9jb21iaW5lZCR5ZWFyKQpjYW5keV9jb21iaW5lZCRpbnRlcm5hbF9pZCA8LSBhcy5pbnRlZ2VyKGNhbmR5X2NvbWJpbmVkJGludGVybmFsX2lkKQpoZWFkKGNhbmR5X2NvbWJpbmVkKQoKYGBgCgojIHJlbW92ZSBhZ2UgZ3JlYXRlciB0aGFuIDEyMgoKYGBge3J9CmNhbmR5X2NvbWJpbmVkIDwtIGNhbmR5X2NvbWJpbmVkICU+JQogIGZpbHRlcihhZ2UgPD0gMTIyKQoKbGVuZ3RoKGNhbmR5X2NvbWJpbmVkJGFnZSkKZGlzdGluY3QoY2FuZHlfY29tYmluZWQsIGFnZSkKYGBgCgojIENoYW5nZSBzdHJpbmcgdmFsdWVzIHRvIGxvd2VyIGNhc2UKCmBgYHtyfQpjYW5keV9jb21iaW5lZCA8LSBjYW5keV9jb21iaW5lZCAlPiUKICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBzdHJfdG9fbG93ZXIpCgpoZWFkKGNhbmR5X2NvbWJpbmVkKQp1bmlxdWUoY2FuZHlfY29tYmluZWQkY291bnRyeSkKY291bnRyeV9kaXN0aW5jdCA8LSBkaXN0aW5jdChjYW5keV9jb21iaW5lZCwgY291bnRyeSkKCmBgYAoKCiMgQ2xlYW5pbmcgY2FuZHkgY29sdW1uCgpgYGB7cn0KY2FuZHlfY29tYmluZWQgPC0gY2FuZHlfY29tYmluZWQgJT4lCiAgbXV0YXRlKGNhbmR5ID0gc3RyX2V4dHJhY3QoY2FuZHksICJbXlxcW1xcXV0rIiksCiAgICAgICAgIGNhbmR5ID0gc3RyX2V4dHJhY3QoY2FuZHksICJbXnE2IHxdK1tefF0rIikpCgpgYGAKCiNjbGVhbmluZyBjb3VudHJ5IGNvbHVtbgoKYGBge3J9CmNhbmFkYV9lcnJvciA8LSBjKCJjYW4iLCAiY2FuYWRhYCIpCnVrX2Vycm9yIDwtIGMoImVuZGxhbmQiLCAiZW5nbGFuZCIsICJzY290bGFuZCIsICJ1LmsuIiwgInVuaXRlZCBraW5kb20iLCAidW5pdGVkIGtpbmdkb20iKQp1c2FfZXJyb3IgPC0gYygiJ21lcmljYSIsICJhbWVyaWNhIiwgIm1lcmljYSIsICJtdXJpY2EiLCAibXVycmlrYSIsICJuLiBhbWVyaWNhIiwgIm5ldyBqZXJzZXkiLCAibmV3IHlvcmsiLCAibm9ydGggY2Fyb2xpbmEiLCAicGl0dHNidXJnaCIsIAogICAgICAgICAgICAgICAidGhlIHVuaXRlZCBzdGF0ZXMiLCAidGhlIHVuaXRlZCBzdGF0ZXMgb2YgYW1lcmljYSIsICJ0aGUgeW9vIGVzcyBvZiBhYWF5eXl5eXkiLCAidHJ1bXBpc3RhbiIsICJ1IHMiLCAidSBzIGEiLCAidS5zLiIsICJ1LnMuYS4iLCAgCiAgICAgICAgICAgICAgICJ1bmhpbmdlZCBzdGF0ZXMiLCAidW5pZWQgc3RhdGVzIiwgInVuaXRlIHN0YXRlcyIsICJ1bml0ZWQgIHN0YXRlcyBvZiBhbWVyaWNhIiwgInVuaXRlZCBzYXRlcyIsICJ1bml0ZWQgc3RhZXMiLCAidW5pdGVkIHN0YXRlIiwgCiAgICAgICAgICAgICAgICJ1bml0ZWQgc3RhdGVhIiwgInVuaXRlZCBzdGF0ZWQiLCAidW5pdGVkIHN0YXRlcyIsICJ1bml0ZWQgc3RhdGVzIG9mIGFtZXJpY2EiLAogICAgICAgICAgICAgICAidW5pdGVkIHN0YXRzcyIsICJ1bml0ZWQgc3RldGVzIiwgInVuaXRlZCBzdHN0ZXMiLCAidW5pdGVzIHN0YXRlcyIsICJ1bml0cyBzdGF0ZXMiLCAidXMiLCAidXMgb2YgYSIsICJ1c2EgdXNhIHVzYSIsICJ1c2EgdXNhIHVzYSB1c2EiLAogICAgICAgICAgICAgICAidXNhIHVzYSB1c2EhISEhIiwgInVzYSEiLCAidXNhISB1c2EhIiwgInVzYSEgdXNhISB1c2EhIiwgInVzYSEhISEhISIsICJ1c2E/IGhhcmQgdG8gdGVsbCBhbnltb3JlLi4iLCAidXNhYSIsICJ1c2FzIiwgInVzYXVzYXVzYSIsICAgCiAgICAgICAgICAgICAgICJ1c3NhIikKY2FuZHlfY29tYmluZWQgPC0gY2FuZHlfY29tYmluZWQgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UoY291bnRyeSAlaW4lIGNhbmFkYV9lcnJvciwgImNhbmFkYSIsIGNvdW50cnkpLAogICAgICAgICBjb3VudHJ5ID0gaWZlbHNlKGNvdW50cnkgJWluJSB1a19lcnJvciwgInVrIiwgY291bnRyeSksCiAgICAgICAgIGNvdW50cnkgPSBpZmVsc2UoY291bnRyeSAlaW4lIHVzYV9lcnJvciwgInVzYSIsIGNvdW50cnkpKQoKY291bnRyeV9kaXN0aW5jdCA8LSBkaXN0aW5jdChjYW5keV9jb21iaW5lZCwgY291bnRyeSkKCmBgYAoKCgpgYGB7cn0KY2FuZHlfY29tYmluZXMgPC0gY2FuZHlfY29tYmluZWQgJT4lCiAgZmlsdGVyKGNhbmR5ICE9ICJjYXNoLCBvciBvdGhlciBmb3JtcyBvZiBsZWdhbCB0ZW5kZXIiKQpgYGAKCgoKI1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAoKMS40LjIgQW5hbHlzaXMgcXVlc3Rpb25zCjEuIFdoYXQgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBjYW5keSByYXRpbmdzIGdpdmVuIGFjcm9zcyB0aGUgdGhyZWUgeWVhcnMuIChudW1iZXIgb2YgY2FuZHkgcmF0aW5ncywgbm90IG51bWJlciBvZiByYXRlcnMuIERvbuKAmXQgY291bnQgbWlzc2luZyB2YWx1ZXMpCgpgYGB7cn0KY2FuZHlfY29tYmluZWQgJT4lCiAgZmlsdGVyKCFpcy5uYShyYXRpbmcpKSAlPiUKICBzdW1tYXJpc2UodG90YWxfcmF0aW5nX2NvdW50ID0gbigpKQoKI3RvdGFsX2NhbmR5X3JhdGluZ3MKYGBgCgoKCjIuIFdoYXQgd2FzIHRoZSBhdmVyYWdlIGFnZSBvZiBwZW9wbGUgd2hvIGFyZSBnb2luZyBvdXQgdHJpY2sgb3IgdHJlYXRpbmcgYW5kIHRoZSBhdmVyYWdlIGFnZSBvZiBwZW9wbGUgbm90IGdvaW5nIHRyaWNrIG9yIHRyZWF0aW5nPwoKYGBge3J9CmNhbmR5X2NvbWJpbmVkICU+JQogIHNlbGVjdChnb2luZ19vdXQsIGFnZSkgJT4lCiAgZmlsdGVyKCFpcy5uYShnb2luZ19vdXQpKSAlPiUKICBncm91cF9ieShnb2luZ19vdXQpICU+JQogIHN1bW1hcmlzZShhdmVyYWdlX2FnZSA9IG1lYW4oYWdlKSkKCgoKYGBgCgoKMy4gRm9yIGVhY2ggb2Ygam95LCBkZXNwYWlyIGFuZCBtZWgsIHdoaWNoIGNhbmR5IGJhciByZXZpdmVkIHRoZSBtb3N0IG9mIHRoZXNlIHJhdGluZ3M/CgpgYGB7cn0KY2FuZHlfY29tYmluZWQgJT4lCiAgc2VsZWN0KGNhbmR5LCByYXRpbmcpICU+JQogIGZpbHRlcighaXMubmEocmF0aW5nKSkgJT4lCiAgZ3JvdXBfYnkocmF0aW5nLCBjYW5keSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUKICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUKICBzbGljZShzZXFfbGVuKDEpKQoKCgpgYGAKCmBgYHtyfQpkaXN0aW5jdChjYW5keV9jb21iaW5lZCwgY2FuZHkpCmBgYAoKCjQuIEhvdyBtYW55IHBlb3BsZSByYXRlZCBTdGFyYnVyc3QgYXMgZGVzcGFpcj8KCmBgYHtyfQpjYW5keV9jb21iaW5lZCAlPiUKICBzZWxlY3QoY2FuZHksIHJhdGluZykgJT4lCiAgZmlsdGVyKGNhbmR5ID09ICJzdGFyYnVyc3QiLCByYXRpbmcgPT0gImRlc3BhaXIiKSAlPiUKICBncm91cF9ieShyYXRpbmcpICU+JQogIHN1bW1hcmlzZShzdGFyYnVyc3RfY291bnQgPSBuKCkpICMlPiUKICAjYXJyYW5nZShkZXNjKGNvdW50KSkgIyU+JQogICNzbGljZShzZXFfbGVuKDMpKQpgYGAKCgpGb3IgdGhlIG5leHQgdGhyZWUgcXVlc3Rpb25zLCBjb3VudCBkZXNwYWlyIGFzIC0xLCBqb3kgYXMgKzEgYW5kIG1laCBhcyAwLgoKNS4gV2hhdCB3YXMgdGhlIG1vc3QgcG9wdWxhciBjYW5keSBiYXIgYnkgdGhpcyByYXRpbmcgc3lzdGVtIGZvciBlYWNoIGdlbmRlciBpbiB0aGUgZGF0YXNldD8KCmBgYHtyfQpjYW5keV9jb21iaW5lZCAlPiUKICBzZWxlY3QoZ2VuZGVyLCBjYW5keSwgcmF0aW5nKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJhdGluZykpICU+JQogIG11dGF0ZShuZXdfcmF0aW5nID0gY2FzZV93aGVuKHJhdGluZyA9PSAiZGVzcGFpciIgfiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbmcgPT0gImpveSIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZyA9PSAibWVoIiB+IDAsKSkgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLCBjYW5keSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50X3BvcHVsYXIgPSBzdW0obmV3X3JhdGluZykpICU+JQogIGFycmFuZ2UoZGVzYyhjb3VudF9wb3B1bGFyKSkgJT4lCiAgc2xpY2Uoc2VxX2xlbigxKSkKCmBgYAoKCjYuIFdoYXQgd2FzIHRoZSBtb3N0IHBvcHVsYXIgY2FuZHkgYmFyIGluIGVhY2ggeWVhcj8KCmBgYHtyfQpjYW5keV9jb21iaW5lZCAlPiUKICBzZWxlY3QoeWVhciwgY2FuZHksIHJhdGluZykgJT4lCiAgZmlsdGVyKCFpcy5uYShyYXRpbmcpKSAlPiUKICBtdXRhdGUobmV3X3JhdGluZyA9IGNhc2Vfd2hlbihyYXRpbmcgPT0gImRlc3BhaXIiIH4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nID09ICJqb3kiIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbmcgPT0gIm1laCIgfiAwLCkpICU+JQogIGdyb3VwX2J5KHllYXIsIGNhbmR5KSAlPiUKICBzdW1tYXJpc2UocG9wdWxhcl9jYW5keSA9IHN1bShuZXdfcmF0aW5nKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBvcHVsYXJfY2FuZHkpKSAlPiUKICBzbGljZShzZXFfbGVuKDEpKQpgYGAKCgo3LiBXaGF0IHdhcyB0aGUgbW9zdCBwb3B1bGFyIGNhbmR5IGJhciBieSB0aGlzIHJhdGluZyBmb3IgcGVvcGxlIGluIFVTLCBDYW5hZGEsIFVLIGFuZCBhbGwgb3RoZXIgY291bnRyaWVzPwoKCmBgYHtyfQoKYGBgCgoKCgoKCgpURVNUClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKCgoKYGBge3J9CnNoZWV0M19sb25nICU+JQogIG11dGF0ZShuZXdfY2FuZHkzPSBzdHJfZXh0cmFjdChjYW5keSwgIlteUTYgfF0rW158XSsiKSkKbmV3X2NhbmR5MwpgYGAKCgpgYGB7cn0Kc2hlZXQyX2xvbmcgJT4lCiAgbXV0YXRlKG5ld19jYW5keTIgPSBzdHJfZXh0cmFjdChjYW5keSwgIlteXFxbXFxdXSsiKSkKbmV3X2NhbmR5MgpgYGAKCgoK